package main
import "fmt"

// []中定义泛型: ~[]E  任何底层类型是E的切片，E comparable 表示 E类型 必须支持 == 和 != 操作
func SlicesIndex[S ~[]E,E comparable](s S,v E) int{
	// 复习：range返回index,value：i接收第一个，即index
	for i := range s{
		if v == s[i]{
			return i
		}
	}
	return -1
}

type List[T any] struct{
	head, tail *element[T]
}

type element[T any] struct{
	next *element[T]
	val T
}

func (lst *List[T]) Push(v T){
	if lst.tail == nil{
		lst.head = &element[T]{val:v}
		lst.tail = lst.head
	}else{
		lst.tail.next = &element[T]{val:v}
		lst.tail = lst.tail.next
	}
}

func (lst *List[T]) AllElement() []T{
	var elems []T
	for e := lst.head;e != nil;e = e.next{
		elems = append(elems,e.val)
	}
	return elems
}

func main(){
	s := []string{"foo","bar","zoo"}
	fmt.Println("index of zoo: ",SlicesIndex(s,"zoo"))

	lst := List[int]{}

	lst.Push(10)
	lst.Push(20)
	lst.Push(40)
	fmt.Println(lst.AllElement())

	lst2 := List[string]{}
	lst2.Push("alan")
	lst2.Push("noc")
	lst2.Push("ghost-him")
	fmt.Println(lst2.AllElement())
}